package com.haiyou.common.system;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.commons.lang3.Validate;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import com.google.common.collect.Maps;

import lombok.extern.slf4j.Slf4j;


/**
 * 
 * @Description: 配置文件抽象实现
 * @author xingyuan
 * @date 2022年8月31日 下午6:01:37
 */
@Slf4j
public abstract class ConfigProperties {

	/**
	 * 缓存
	 */
	private static Map<String, ConfigProperties> pool = Maps.newHashMap();
	
	/**
	 * 默认
	 */
	private static ConfigProperties defaultProperties = new FileProperties();
	
	
	public ConfigProperties() {
		pool.put(getKey(), this);
	}
	
	/**
	 * 获取 操作对象
	 * @param key
	 * @return
	 */
	public static ConfigProperties getConfigProperties(String key) {
		
		ConfigProperties properties = pool.getOrDefault(key, null);
		
		if(ObjectUtils.isEmpty(properties)) {
			return defaultProperties;
		}
		
		if(!properties.initSuccess()) {
			return defaultProperties;
		}
		
		return properties;
	}
	
	
	/**
	 * 日期格式
	 */
	public static final String date_formate = "yyyy-MM-dd mm:HH:ss";
	
	/**
	 * 日期转换
	 */
	public static final SimpleDateFormat date_formate_parse = new SimpleDateFormat(date_formate);
	
	/**
	 * 初始化是否成功
	 * @return
	 */
	public abstract boolean initSuccess();
	
	/**
	 * 类型
	 * @return
	 */
	public abstract String getKey();
	
	/**
	 * 获取 string 参数
	 * @param key
	 * @param defaultValue
	 * @return
	 */
	public abstract String getString(String key, String defaultValue);
	
	/**
	 * 获取 string 参数
	 * @param key
	 * @return
	 */
	public String getString(String key) {
		Validate.isTrue(StringUtils.hasLength(key));
		String value = getString(key);
		Validate.isTrue(value != null, "not exists value for key [%s]", key);
		return value;
	}

	/**
	 * 获取 int 参数
	 * @param key
	 * @param defalutValue
	 * @return
	 */
	public int getInt(String key,int defalutValue) {
		return Integer.parseInt(getString(key,String.valueOf(defalutValue)));
	}
	
	/**
	 * 获取 long 参数
	 * @param key
	 * @param defalutValue
	 * @return
	 */
	public long getLong(String key,long defalutValue) {
		return Long.parseLong(getString(key,String.valueOf(defalutValue)));
	}
	
	/**
	 * 获取 boolean 参数
	 * @param key
	 * @param defalutValue
	 * @return
	 */
	public boolean getBoolean(String key,boolean defalutValue) {
		return Boolean.valueOf(getString(key,String.valueOf(defalutValue)));
	}
	
	/**
	 * 获取 float 参数
	 * @param key
	 * @param defalutValue
	 * @return
	 */
	public float getFloat(String key,float defalutValue) {
		return Float.parseFloat(getString(key,String.valueOf(defalutValue)));
	}
	
	/**
	 * 获取 double 参数
	 * @param key
	 * @param defalutValue
	 * @return
	 */
	public double getDouble(String key,float defalutValue) {
		return Double.parseDouble(getString(key,String.valueOf(defalutValue)));
	}
	
	/**
	 * 获取 date 参数
	 * @param key
	 * @param date
	 * @return
	 */
	public Date getDate(String key,Date date) {
		String value = null;
		try {
			value = getString(key, null);
			
			if(StringUtils.hasLength(value)) {
				return date_formate_parse.parse(value);
			}else {
				return date;
			}
		} catch (Exception e) {
			log.error("参数格式异常,key:{},value:{}",key,value);
			log.error(e.getMessage(),e);
		}
		return null;
	}


	/**
	 * 获取(windows:src/main/resources/linux:resources)配置文件
	 * </p>
	 * key对应的value所在的绝对路径, value只需要简单的名称就可以,内部会自动根据系统类型和项目根目录补全绝对路径
	 * 
	 * @param key
	 * @param defaultValue
	 * @return
	 */
	public String getResourcesAbsolutePath(String key, String defaultValue) {
		return SystemProperties.getResourcesAbsolutePath(key,defaultValue);
	}

}

